package br.com.JZSolution.persistencia;

import java.lang.reflect.ParameterizedType;

import java.util.List;

import javax.persistence.EntityManager;

/**
 * SuperDao - Cria a persistencia basica para o CRUD de um DAO
 * 
 * @param <T> - Entidade a ser persistida
 */
public abstract class SuperDao<T> {
	protected Class<T> entidadePersistente = null;
	protected EntityManager em = null; 
	
	@SuppressWarnings("unchecked")
	public SuperDao() {
		entidadePersistente = (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	public void criar(T objeto) {
		em.persist(objeto);
	}
	
	public T atualizar(T objeto){
		T obj = em.merge(objeto);
		return obj;
	}
	
	public void remover(T objeto){
		em.remove(objeto);
	}
	
	public T selecionar(Long id){
		return em.find(entidadePersistente, id);
	}
	
	public abstract List<T> listar() ;
	
	public abstract void remover(Long id) ;
	
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}
	public EntityManager getEm() {
		return em;
	}
	
}
